bitkeeper revision 1.1159.1.289 (417fb030yj7vBz8Pvd4b0uvFxr0PzQ)
authorkaf24@freefall.cl.cam.ac.uk <kaf24@freefall.cl.cam.ac.uk>
Wed, 27 Oct 2004 14:26:56 +0000 (14:26 +0000)
committerkaf24@freefall.cl.cam.ac.uk <kaf24@freefall.cl.cam.ac.uk>
Wed, 27 Oct 2004 14:26:56 +0000 (14:26 +0000)
Ensure we use 64-bit arithmetic when converting a possibly-large
microseconds value into a nanoseconds value (e.g., when calculating
current system time in the timer interrupt handler).

linux-2.4.27-xen-sparse/arch/xen/kernel/time.c
linux-2.6.9-xen-sparse/arch/xen/i386/kernel/time.c

index 9ff844d70e2c5a20020a0df17bee347d5bcc23b0..3a4f8bf2c53d4acd243d59ce4935add0d8e5b555 100644 (file)
@@ -397,7 +397,7 @@ static inline void do_timer_interrupt(int irq, void *dev_id,
         __get_time_values_from_xen();
         
         delta = (s64)(shadow_system_time + 
-                      (__get_time_delta_usecs() * 1000) -
+                      ((s64)__get_time_delta_usecs() * 1000LL) -
                       processed_system_time);
     }
     while ( !TIME_VALUES_UP_TO_DATE );
index 15bc102ce6769151b5d2f689f6727611cd4483d1..d924f7a8e56196b8da9b160972f0c85221b65fe8 100644 (file)
@@ -273,7 +273,8 @@ int do_settimeofday(struct timespec *tv)
         * be stale, so we can retry with fresh ones.
         */
  again:
-       nsec = tv->tv_nsec - cur_timer->get_offset() * NSEC_PER_USEC;
+       nsec = (s64)tv->tv_nsec -
+           ((s64)cur_timer->get_offset() * (s64)NSEC_PER_USEC);
        if (unlikely(!TIME_VALUES_UP_TO_DATE)) {
                __get_time_values_from_xen();
                goto again;
@@ -383,15 +384,16 @@ static inline void do_timer_interrupt(int irq, void *dev_id,
                __get_time_values_from_xen();
 
                delta = (s64)(shadow_system_time +
-                             (cur_timer->get_offset() * NSEC_PER_USEC) -
+                             ((s64)cur_timer->get_offset() * 
+                              (s64)NSEC_PER_USEC) -
                              processed_system_time);
        }
        while (!TIME_VALUES_UP_TO_DATE);
 
        if (unlikely(delta < 0)) {
-               printk("Timer ISR: Time went backwards: %lld %lld %ld %lld\n",
+               printk("Timer ISR: Time went backwards: %lld %lld %lld %lld\n",
                       delta, shadow_system_time,
-                      (cur_timer->get_offset() * NSEC_PER_USEC), 
+                      ((s64)cur_timer->get_offset() * (s64)NSEC_PER_USEC), 
                       processed_system_time);
                return;
        }